package it.polimi.traveldream.ejb.pacchettomanagement;

import java.util.ArrayList;
import java.util.List;

import it.polimi.traveldream.ejb.pacchettomanagement.PacchettoMgr;
import it.polimi.traveldream.ejb.prodottobasemanagement.ProdottoBase;
import javax.annotation.Resource;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * Session Bean implementation class PacchettoBean
 */
@Stateless
public class PacchettoMgrBean implements PacchettoMgr {

	@PersistenceContext
    private EntityManager em;
	
	@Resource
	private EJBContext context;
	
	public void save(PacchettoDTO nuovoPacchetto){
		Query qA = em.createNamedQuery("ProdottoBase.TROVAALBERGHI");
		qA.setParameter("id", nuovoPacchetto.getAlbergo().getIdProdottoBase());
		ProdottoBase albergo = (ProdottoBase) qA.getSingleResult();
		
		 Query qV = em.createNamedQuery("ProdottoBase.TROVAVOLI");
		 qV.setParameter("id", nuovoPacchetto.getVolo().getIdProdottoBase());
		 ProdottoBase volo = (ProdottoBase) qV.getSingleResult();
		
		 Query qE = em.createNamedQuery("ProdottoBase.TROVAESCURSIONI");
		 qE.setParameter("id", nuovoPacchetto.getEscursione().getIdProdottoBase());
		 ProdottoBase escursione = (ProdottoBase) qE.getSingleResult();
		
		Pacchetto newP = new Pacchetto(nuovoPacchetto);
		newP.setAlbergo(albergo);
		 newP.setVolo(volo);
		 newP.setEscursione(escursione);
		em.persist(newP);
	};
	
	public void remove(PacchettoDTO nuovoPacchetto){
		Pacchetto cancP = em.find(Pacchetto.class, nuovoPacchetto.getIdPacchetto());
		em.remove(cancP);
	}
	
	public void personalizza(PacchettoDTO nuovoPacchetto) {
		em.persist(new Pacchetto(nuovoPacchetto));
	}
	

	public PacchettoDTO getPacchettoDTO(int indice){
		Pacchetto p = em.find(Pacchetto.class, indice);
		return convertToPDTO(p);
	}
	
	private PacchettoDTO convertToPDTO(Pacchetto nuovo) {
		PacchettoDTO convertp = new PacchettoDTO();
		convertp.setIdPacchetto(nuovo.getIdPacchetto());
		convertp.setNome(nuovo.getNome());
		convertp.setDescrizione(nuovo.getDescrizione());

		return convertp;
	}
	
	public List<PacchettoDTO> getPacchettiDTO() {
		List<Pacchetto> listap = em.createNamedQuery(Pacchetto.FIND_ALL, Pacchetto.class).getResultList();
		List<PacchettoDTO> listapdto = new ArrayList<>();
		
		for(Pacchetto p: listap){
			listapdto.add(convertToPDTO(p));
		}
		return listapdto;
	}
	
	public List<Pacchetto> getPacchetti(){
		return em.createNamedQuery(Pacchetto.FIND_ALL, Pacchetto.class).getResultList(); 
	}

	public List<?> findVolo(String aeroportoPartenza, String aeroportoArrivo){
		Query q = em.createNamedQuery("Pacchetto.findVolo"); 
		q.setParameter("aeroPart", aeroportoPartenza);
		q.setParameter("aeroArr", aeroportoArrivo);
		return q.getResultList();
	}

	public PacchettoDTO findPacchettoDTO(int idPacchetto){
		Pacchetto pacchettotmp = em.find(Pacchetto.class, idPacchetto);
		return convertToPDTO(pacchettotmp);
	}


}
